﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Engine.Sgml.Validation {
    internal sealed class ProcessingInstructionValidator : IElementValidator {
        private SgmlDocument document;

        public ProcessingInstructionValidator(SgmlDocument document) {
            Guard.ArgumentNotNull(document, "document");
            this.document = document;
            }

        public SElement Validate(SElement element, SElement node) {
            // Установить тип документа XML если в корневом узле документа
            // есть инструкция для приложений
            if (element.IsXmlDeclaration()) {
                if (node.NodeType == SgmlNodeType.Document) {
                    document.DocumentType = SgmlDocumentType.Xml;
                    if (element.OrderIndex != 0) {
                        if (node.HasElements && node.FirstNode.NodeType == SgmlNodeType.ProcessingInstruction)
                            node.Nodes.Pop();
                        else
                            element.Move(0);
                        }
                    }
                else {
                    SElement root = node.Root;
                    if (root.FirstNode.NodeType == SgmlNodeType.ProcessingInstruction)
                        node.Nodes.Pop();
                    else
                        root.AddFirst(element);
                    }
                }
            return node;
            }
        }
    }
